//
//  CZEmoticonManager.swift
//  61.新工程表情键盘
//
//  Created by apple on 16/3/7.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

// Emoticons.bundle的路径
let emoticonsBundlePath = NSBundle.mainBundle().pathForResource("Emoticons", ofType: "bundle")!

/// 处理表情和表情包的相关操作
class CZEmoticonManager: NSObject {
    // 单例
    static let sharedManager: CZEmoticonManager = CZEmoticonManager()
    
    /// 所有表情包模型属性,懒加载,只加载一次
    lazy var emoticonPackages: [CZEmoticonPackageModel] = self.loadEmoticonPackages()
    
    /// 最近表情归档和解档的路径
    private let archiveEmoticonPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/recentEmoticons.plist")
    
    /**
     加载单个表情包数据
     
     - parameter id: 表情包文件夹名称
     */
    private func loadEmoticonPackage(id: String) -> CZEmoticonPackageModel {
        // 加载每个表情包对应的info.plist
        // info.plist = Emoticons.bundle/id/info.plist
        let infoPath = emoticonsBundlePath + "/" + id + "/" + "info.plist"
        
        // 加载info.plist到内存中
        let infoDict = NSDictionary(contentsOfFile: infoPath)!
        
        // 解析infoDict
        // 获取 group_name_cn
        let group_name_cn = infoDict["group_name_cn"] as! String
        
        // 获取 emoticons 表情数组
        let emoticonsArray = infoDict["emoticons"] as! [[String: String]]
        
        // 数组记录表情模型
        var emoticons = [CZEmoticonModel]()
        
        // 遍历表情数组
        for dict in emoticonsArray {
            // 将每个表情字典转成表情模型
            let emoticonModel = CZEmoticonModel(id: id, dict: dict)
            emoticons.append(emoticonModel)
        }
        
        // 所有的表情模型都加载完成了,创建表情包模型
        let package = CZEmoticonPackageModel(id: id, group_name_cn: group_name_cn, emoticons: emoticons)
        return package
    }
    
    /**
     加载所有表情包,只需要从磁盘上加载一次,方法不暴露给别人
     
     - returns: 所有表情包
     */
    private func loadEmoticonPackages() -> [CZEmoticonPackageModel] {
        // 创建最近表情包, 没有id,一创建就去沙盒里面加载表情模型
        let recentModel = CZEmoticonPackageModel(id: "", group_name_cn: "最近", emoticons: loadRecentEmoticons())
        
        let defaultModel = loadEmoticonPackage("com.sina.default")
        let emojiModel = loadEmoticonPackage("com.apple.emoji")
        let lxhModel = loadEmoticonPackage("com.sina.lxh")
        
        return [recentModel, defaultModel, emojiModel, lxhModel]
    }
    
    /**
     将点击的表情添加到 最近 这组 而且是最近这组的第0页
     
     - parameter emoticon: 要添加的表情
     */
    func addFavorate(emoticon: CZEmoticonModel) {
        // 获取最近的第0页, 是一个表情模型数组
        var recentEmoticons = emoticonPackages[0].pageEmoticons[0]
        
        // 判断如果数组已经存在这个表情,将这个表情移除
        let repeatEmoticons = recentEmoticons.filter { (e) -> Bool in
            // emoji表情
            if let emoji = e.emoji {
                return emoji == emoticon.emoji
            } else {
                return e.chs == emoticon.chs
            }
        }
        
        for emoticon in repeatEmoticons {
            // 删除重复的表情
            let index = recentEmoticons.indexOf(emoticon)
            recentEmoticons.removeAtIndex(index!)
        }
        
        // 将点击的表情添加到数组中
        recentEmoticons.insert(emoticon, atIndex: 0)
        
        // 如果数量大于20个,删除最后一个
        if recentEmoticons.count > CZEmoticonNumberOfPage {
            recentEmoticons.removeLast()
        }
        
        // 一定要记得将数组从新赋值给
        emoticonPackages[0].pageEmoticons[0] = recentEmoticons
        
        // 保存起来
        saveRecentEmoticons()
    }
    
    /// 保存表情模型
    private func saveRecentEmoticons() {
//        print("archiveEmoticonPath: \(archiveEmoticonPath)")
        NSKeyedArchiver.archiveRootObject(emoticonPackages[0].pageEmoticons[0], toFile: archiveEmoticonPath)
    }
    
    /// 加载之前的表情模型
    private func loadRecentEmoticons() -> [CZEmoticonModel] {
        if let emoticons = NSKeyedUnarchiver.unarchiveObjectWithFile(archiveEmoticonPath) as? [CZEmoticonModel] {
            // 遍历解档出来的emoticon对象.重新赋值png,目的是重新拼接pngPath
            for emoticon in emoticons {
                if let png = emoticon.png {
                    emoticon.png = png
                }
            }
            return emoticons
        } else {
            return [CZEmoticonModel]()
        }
    }
}
